package menus;

import bitclub.Alquiler;
import bitclub.Articulo;
import bitclub.BitUtil;
import bitclub.Cliente;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * Opciones Dentro del menú CLIENTES
 * @author BitCompany
 */
public class OpcionesClientes {
    
    /**
     * Crea un objeto cliente pidiendo sus atributos y llamando al constructor
     * y después le da de alta en la base de datos (BUENO, TODAVÍA NO!)
     */
    public static void opcionClientesDarAlta() {
        Cliente cliente;
        BitUtil.borra();

        //Cogemos todos los datos uno a uno
        System.out.println("NUEVO CLIENTE");
        System.out.println("--------------------");
        String nombre = BitUtil.dameCadena("Nombre: ");
        String apellidos = BitUtil.dameCadena("Apellidos: ");
        String dni = BitUtil.dameEnteroFijo("DNI: ",8);
        String mail = BitUtil.dameCadena("E-mail: ");
        String telFijo = BitUtil.dameCadena("Tel. Fijo: ");
        String telMovil = BitUtil.dameCadena("Tel. Movil: ");
        String direccion = BitUtil.dameCadena("Dirección: ");
        String cp = BitUtil.dameCadena("Codigo postal: ");
        String localidad = BitUtil.dameCadena("Localidad: ");
        Date fechaNacimiento = BitUtil.dameFecha("Fecha nacimiento: ");
        char sexo = BitUtil.dameCadena("Sexo: (Hombre/Mujer): ").charAt(0);
        Date fechaAlta = new Date();
        Date fechaBaja = null;
        String password = BitUtil.dameCadena("Password: ");
        double saldo = BitUtil.dameDouble("Introducir saldo: ");

        //Creamos el cliente con todos los datos recopilados
        cliente = new Cliente(nombre, apellidos, dni, true, mail, telFijo, telMovil, direccion, cp, localidad, fechaNacimiento, sexo, fechaAlta, null, password, saldo, null, false);

        //Borramos pantalla, mostramos el cliente completo y pedimos confirmación
        BitUtil.borra();
        System.out.println(cliente.toString());
        boolean confirmado = BitUtil.dameConfirmacion("Dar de alta este cliente? (s/n) ");

        //Si confirmamos pedimos al objeto que se guarde y si no lo descartamos
        if (confirmado) {
            cliente.nuevo();
            System.out.println("El cliente se ha almacenado correctamente (supongo)");
            BitUtil.esperaEnter();
            //Si almacenamos un cliente con saldo acordarse de crear un movimiento para la caja.
        } else {
            System.out.println("El cliente ha sido descartado");
            BitUtil.esperaEnter();
        }
    }

    /**
     * Ver datos de un cliente
     * @param cliente 
     */
    public static void opcionClientesVer(Cliente cliente) {
        System.out.println(cliente.toString());
        BitUtil.esperaEnter();
    }

    /**
     * Para editar un cliente
     */
    public static void opcionClientesEditar(Cliente Cli1) {

        //Atributos
        String opciones[] = {"Nombre", "Apellidos", "DNI", "Email", "Tel_fijo", "Tel_movil", "Dirección", "C.P.", "Localidad", "Fech_Nacimiento", "Sexo", "Fech_Alta", "Fech_Baja", "Password"};
        String seguir_editando = ""; // esta variable decide si seguimos editando o no
        String modificar_con = ""; // esta variable almacena el nuevo valor para el campo a editar
        char mod_sexo = 'H'; // variable para almacenar el carácter relativo al sexo
        
        do {
            //Mostrando el menú para editar al cliente
            BitUtil.borra();
            int respuesta = BitUtil.muestraMenu("EDITAR CLIENTE", opciones); // NO COMMENT
            //Opciones disponibles:
            switch (respuesta) {

                case 1://Opción 1
                    System.out.println("Introduzca el nuevo Nombre de " + Cli1.getNombre() + "\n");
                    modificar_con = BitUtil.dameCadena(modificar_con);
                    Cli1.setNombre(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 2://Opción 2
                    System.out.println("Introduzca los nuevos apellidos de " + Cli1.getApellidos() + "\n");
                    modificar_con = BitUtil.dameCadena(modificar_con);
                    Cli1.setApellidos(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 3://Opción 3
                    System.out.println("Introduzca el nuevo DNI " + Cli1.getDni() + "\n");
                    modificar_con = BitUtil.dameEnteroFijo("8 cifras sin la letra", 8);
                    Cli1.setDni(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 4://Opción 4
                    boolean respu;
                    do{
                    System.out.println("Introduzca el nuevo email " + Cli1.getMail() + "\n");
                    modificar_con = BitUtil.dameCadena(modificar_con);
                    respu = BitUtil.checkMail(modificar_con);
                    }while(respu != true);
                    
                    Cli1.setMail(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 5://Opción 5
                    System.out.println("Introduzca el nuevo Teléfono fijo " + Cli1.getTel_fijo() + "\n");
                    modificar_con = BitUtil.dameEnteroFijo("9 cifras", 9);
                    Cli1.setTel_fijo(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 6://Opción 6
                    System.out.println("Introduzca el nuevo móvil " + Cli1.getTel_movil() + "\n");
                    modificar_con = BitUtil.dameEnteroFijo("9 cifras", 9);
                    Cli1.setTel_movil(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 7://Opción 7
                    System.out.println("Introduzca la nueva dirección " + Cli1.getDireccion() + "\n");
                    modificar_con = BitUtil.dameCadena(modificar_con);
                    Cli1.setDireccion(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 8://Opción 8
                    System.out.println("Introduzca el nuevo Código Postal " + Cli1.getCodigoPostal() + "\n");
                    modificar_con = BitUtil.dameEnteroFijo("Número de cinco cifras", 5);
                    Cli1.setCodigoPostal(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 9://Opción 9
                    System.out.println("Introduzca la nueva localidad " + Cli1.getLocalidad() + "\n");
                    modificar_con = BitUtil.dameCadena(modificar_con);
                    Cli1.setLocalidad(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 10://Opción 10

                    Date nueva_fecha = BitUtil.dameFecha("Introduce la nueva fecha " + BitUtil.muestraFecha(Cli1.getNacimiento()) + "\n");
                    Cli1.setNacimiento(nueva_fecha);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 11://Opción 11
                    int exit = 0;
                    do{
                    System.out.println("Introduzca el nuevo sexo " + Cli1.getSexo() + "\n");
                    char[] miChar;
                    miChar = BitUtil.dameCadena(modificar_con).toCharArray();
                    mod_sexo = miChar[0];
                    if (mod_sexo == 'h' || mod_sexo == 'H' || mod_sexo == 'm' || mod_sexo == 'M') {
                        Cli1.setSexo(mod_sexo);
                        exit = 1;
                        
                    } else {
                        System.out.println("Especie no encontrada en la BDD");
                        System.out.println("El sexo sólo puede ser Hombre o Mujer");
                        
                    }
                    }while(exit == 0);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;
                    
                    
                    
                case 12://Opción 12
                    Date nueva_fecha2 = BitUtil.dameFecha("Introduce la nueva fecha " + BitUtil.muestraFecha(Cli1.getFechaAlta()) + "\n");
                    Cli1.setFechaAlta(nueva_fecha2);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 13://Opción 13
                    Date nueva_fecha3 = BitUtil.dameFecha("Introduce la nueva fecha " + BitUtil.muestraFecha(Cli1.getFechaBaja()) + "\n");
                    Cli1.setFechaBaja(nueva_fecha3);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 14://Opción 14
                    System.out.println("Introduzca la nueva contraseña " + Cli1.getPassword() + "\n");
                    modificar_con = BitUtil.dameCadena(modificar_con);
                    Cli1.setPassword(modificar_con);
                    System.out.println("¿Desea seguir editando?[Y/N]");
                    seguir_editando = BitUtil.dameCadena(seguir_editando);
                    break;

                case 0:
                    //Aqui debería SALIR del menú editar cliente   ATENCION VER ESTO

                    //Pedimos confirmación para sobreescribir los datos
                    Boolean resp = BitUtil.dameConfirmacion("¿Descartar todos los cambios? [Y/N]");
                    //Descartamos todos los cambios realizados o confirmamos dichos cambios
                    if (resp == true) {
                        System.out.println("Se han descartado los cambios");
                    } else {
                        Cli1.actualizar();
                        System.out.println("Los cambios se han guardado con éxito");
                        BitUtil.esperaEnter();

                    }

                    break;
                default://EN OTRO CASO
                    System.out.println("Por favor introduzca una de las opciones posibles, gracias");
                    break;
            }
        } while (seguir_editando.equals("Y") || seguir_editando.equals("y"));//CONDICION DE SALIDA

        //Limpiamos la pantalla
        BitUtil.borra();

        //Mostramos la ficha del cliente editado
        System.out.println(Cli1.toString());

        //Pedimos confirmación para sobreescribir los datos
        Boolean resp = BitUtil.dameConfirmacion("¿Está de acuerdo con las modificaciones del Cliente?");
        //Descartamos todos los cambios realizados o confirmamos dichos cambios
        if (resp == true) {
            Cli1.actualizar();
            System.out.println("Los cambios se han guardado con éxito");
            BitUtil.esperaEnter();
        } else {
            System.out.println("Se han descartado los cambios");
        }


    }

    /**
     * Muestra una lista de los alquileres de un cliente
     * @param cliente
     */
    public static void opcionClientesVerAlquileres(Cliente cliente) {
        //Lista de alquileres y su iterador
        List<Alquiler> listAlquiler = cliente.getListAlquiler();
        //Iterator itAlquileres = listAlquiler.iterator();

        BitUtil.borra();
        System.out.println("El cliente: "+cliente.getNombre()+"\n-----------------------\n");
        
        for(Alquiler alquiler:listAlquiler){
            System.out.println("Alquiler de " + BitUtil.muestraFecha(alquiler.getFechaAlquiler()));
            for(Articulo articulo:alquiler.getListArticulo()){
                System.out.println("     - "+articulo.getTitulo());
            }
        }

        System.out.println("");
        BitUtil.esperaEnter();
    }

    /**
     * Da de baja un cliente o le da de alta si ya estaba de baja
     * @param cliente
     */
    public static void opcionClientesDarBaja(Cliente cliente) {
        boolean baja;
        if (cliente.isActivo()) {
            System.out.println("Este cliente está activo.");
            baja = BitUtil.dameConfirmacion("Quiere darle de baja? (S/N) ");
            if (baja) {
                cliente.setFechaBaja(new Date());
                cliente.setActivo(false);
                cliente.actualizar();
                System.out.println("El cliente ha sido dado de baja.");
                BitUtil.esperaEnter();
            }
        } else {
            System.out.println("Este cliente no está activo.");
            baja = BitUtil.dameConfirmacion("Quiere darle de alta? (S/N) ");
            if (baja) {
                cliente.setFechaAlta(new Date());
                cliente.setActivo(true);
                cliente.actualizar();
                System.out.println("El cliente ha sido dado de alta.");
                BitUtil.esperaEnter();
            }
        }

    }

    /**
     * Da de baja o de alta un cliente
     * @param cliente 
     */
    public static void opcionClientesIngresarSaldo(Cliente cliente) {
        System.out.println("Saldo Actual: " + cliente.getSaldo() + "€");
        double cantidad = BitUtil.dameDouble("Ingresar: ");
        if (cantidad > 0) {
            cliente.setSaldo(cliente.getSaldo() + cantidad);
        }
        cliente.actualizar();
    }

    /**
     * Bloquea o desbloquea un cliente
     * @param cliente 
     */
    public static void opcionClientesBloquear(Cliente cliente) {
        boolean bloquear;
        if (cliente.isBloqueado()) {
            System.out.println("Este cliente está bloqueado.");
            bloquear = BitUtil.dameConfirmacion("Quiere desbloquearlo? (S/N) ");
            if (bloquear) {
                cliente.setBloqueado(false);
                cliente.setFechaAlta(new Date());
                cliente.setActivo(true);
                cliente.actualizar();
                System.out.println("Cliente desbloqueado");
                BitUtil.esperaEnter();
            }
        } else {
            System.out.println("Este cliente no está bloqueado.");
            bloquear = BitUtil.dameConfirmacion("Quiere bloquearlo? (S/N) ");
            if (bloquear) {
                cliente.setBloqueado(true);
                cliente.setFechaBaja(new Date());
                cliente.setActivo(false);
                cliente.actualizar();
                System.out.println("Cliente bloqueado");
                BitUtil.esperaEnter();
            }
        }
    }
    
}
